package com.hethongviet.job;

import android.annotation.TargetApi;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;

public class Connectivity
{
	/*
	 * HACKISH: These constants aren't yet available in my API level (7), but I
	 * need to handle these cases if they come up, on newer versions
	 */
	public static final int NETWORK_TYPE_EHRPD = 14; // Level 11
	public static final int NETWORK_TYPE_EVDO_B = 12; // Level 9
	public static final int NETWORK_TYPE_HSPAP = 15; // Level 13
	public static final int NETWORK_TYPE_IDEN = 11; // Level 8
	public static final int NETWORK_TYPE_LTE = 13; // Level 11

	/**
	 * Check if there is any connectivity
	 * 
	 * @param context
	 * @return
	 */
	public static boolean isConnected(Context context)
	{
		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = cm.getActiveNetworkInfo();
		return (info != null && info.isConnected());
	}

	/**
	 * Check if there is fast connectivity
	 * 
	 * @param context
	 * @return
	 */
	@TargetApi(3)
	public static boolean isConnectedFast(Context context)
	{
		if (Config.IS_DEBUG_CONNECT_FAST)
		{
			return Config.IS_CONNECT_FAST;
		}
		else
		{
			ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
			NetworkInfo info = cm.getActiveNetworkInfo();
			return (info != null && info.isConnected() && Connectivity.isConnectionFast(
					info.getType(), info.getSubtype()));
		}
	}

	/**
	 * Check if the connection is fast (>=5Mbps)
	 * 
	 * @param type
	 * @param subType
	 * @return
	 */
	public static boolean isConnectionFast(int type, int subType)
	{
		AppMain.debug("Network type = " + type + "	and subtype = " + subType);

		if (type == ConnectivityManager.TYPE_WIFI)
		{
			System.out.println("CONNECTED VIA WIFI");
			return true;
		}
		else if (type == ConnectivityManager.TYPE_MOBILE)
		{
			switch (subType)
			{
			case TelephonyManager.NETWORK_TYPE_1xRTT:
				return false; // ~ 50-100 kbps
			case TelephonyManager.NETWORK_TYPE_CDMA:
				return false; // ~ 14-64 kbps
			case TelephonyManager.NETWORK_TYPE_EDGE:
				return false; // ~ 50-100 kbps
			case TelephonyManager.NETWORK_TYPE_EVDO_0:
				return false; // ~ 400-1000 kbps
			case TelephonyManager.NETWORK_TYPE_EVDO_A:
				return false; // ~ 600-1400 kbps
			case TelephonyManager.NETWORK_TYPE_GPRS:
				return false; // ~ 100 kbps
			case TelephonyManager.NETWORK_TYPE_HSDPA:
				return false; // ~ 2-14 Mbps
			case TelephonyManager.NETWORK_TYPE_HSPA:
				return false; // ~ 700-1700 kbps
			case TelephonyManager.NETWORK_TYPE_HSUPA:
				return false; // ~ 1-23 Mbps
			case TelephonyManager.NETWORK_TYPE_UMTS:
				return false; // ~ 400-7000 kbps
				// NOT AVAILABLE YET IN API LEVEL 7
			case Connectivity.NETWORK_TYPE_EHRPD:
				return false; // ~ 1-2 Mbps
			case Connectivity.NETWORK_TYPE_EVDO_B:
				return true; // ~ 5 Mbps
			case Connectivity.NETWORK_TYPE_HSPAP:
				return true; // ~ 10-20 Mbps
			case Connectivity.NETWORK_TYPE_IDEN:
				return false; // ~25 kbps
			case Connectivity.NETWORK_TYPE_LTE:
				return true; // ~ 10+ Mbps
				// Unknown
			case TelephonyManager.NETWORK_TYPE_UNKNOWN:
			default:
				return false;
			}
		}
		else
		{
			return false;
		}
	}

}
